package com.wuyanzu.shixicoderedo.service.impl;

import com.wuyanzu.shixicoderedo.common.entity.User;
import com.wuyanzu.shixicoderedo.common.utils.jwt.JwtUtil;
import com.wuyanzu.shixicoderedo.common.vo.RegisterVO;
import com.wuyanzu.shixicoderedo.mapper.UserMapper;
import com.wuyanzu.shixicoderedo.service.AuthService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * 认证服务实现类
 * 提供用户注册、登录和查询功能
 */
@Service
public class AuthServiceImpl implements AuthService {
    // 注入用户数据访问对象
    @Autowired
    private UserMapper userMapper;

    // 注入JWT工具类
    @Autowired
    private JwtUtil jwtUtil;

    /**
     * 用户注册方法
     * @param username 用户名
     * @param rawPassword 原始密码
     * @param displayName 显示名称
     * @return 注册成功的用户对象
     * @throws IllegalArgumentException 当用户名已存在时抛出异常
     */
    public RegisterVO register(String username, String rawPassword, String displayName) {
        // 检查用户名是否已存在
        if (userMapper.findByUsername(username) != null) {
            throw new IllegalArgumentException("username exists");
        }
        // 创建新用户对象
        User u = new User();
        u.setUsername(username);
        u.setPassword(rawPassword);
        // 如果未提供显示名称，则使用用户名作为显示名称
        u.setDisplayName(displayName == null ? username : displayName);
        // 保存用户到数据库
        userMapper.insert(u);
        // 出于安全考虑，不返回密码字段

        RegisterVO registerVO = new RegisterVO();
        registerVO.setUsername(u.getUsername());
        return registerVO;
    }

    /**
     * 用户登录方法
     * @param username 用户名
     * @param rawPassword 原始密码
     * @return JWT token字符串
     * @throws IllegalArgumentException 当用户不存在或密码错误时抛出异常
     */
    public String login(String username, String rawPassword) {
        // 根据用户名查找用户
        User u = userMapper.findByUsername(username);
        if (u == null) {
            throw new IllegalArgumentException("invalid credentials");
        }
        // 验证密码是否正确
        if (!rawPassword.equals(u.getPassword())) {
            throw new IllegalArgumentException("invalid credentials");
        }
        // 生成并返回JWT token
        return jwtUtil.generateToken(u.getId(), u.getUsername());
    }

    /**
     * 根据ID查找用户
     * @param id 用户ID
     * @return 用户对象（不包含密码）
     */
    public User findById(Long id) {
        User u = userMapper.findById(id);
        // 出于安全考虑，不返回密码字段
        if (u != null) u.setPassword(null);
        return u;
    }
}
